package cn.tedu.generic;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/*泛型  想要模拟数组提前进行类型检查*/
public class TestGeneric1 {
    @Test
    public void test() {
        String[] a = new String[5];
     /*   a[0]=1;
        a[1]=3.4;
        a[2]='d';*/
        a[3] = "泡泡";
        a[4] = "江江";
        List list = new ArrayList();
        //没有数据类型约束，数据类型太自由！！！！！！！！！！！！！！！！！！！！WARNING
        list.add("山东");
        list.add("菏泽");
        list.add("曹县");
        list.add("牛皮");
        list.add(666);
        list.add("我嘞");
        list.add("宝贝儿");

        System.out.println(list);
        /*引入泛型的主要目的通过泛型<?>来约束集合中元素的数据类型*/
        /*泛型的好处 可以把报错的时机提前，在编译期就报错，而不是运行之后抛出异常
        * 在想集合中添加元素时，会先检查元素的数据类型是否匹配，不是要求的类型就编译失败
        * 泛型的格式<>
        可以根据自己的需求但注意必须是引用类型不能是基本数据类型
        * */
        List<String> list1 = new ArrayList<String>();
        list1.add("1212");

    }

    @Test
    public void test1() {
        Integer[] a = {1, 2, 3, 4, 5, 6, 7};
        String b[] = {"大哥", "二弟"};
        Double[] c = {6.0, 6.6, 6.66, 6.66666, 6.789};
        print(a);
        print(b);
        print(c);
        method(a);
        method(b);
        method(c);
        HashMap hashMap = new HashMap();
        hashMap.put(12,12);
    }
/*泛型可以实现更加通用的代码
* 泛型的语法要求：如果在方法上使用泛型 必须两处同时出现
* 一个是传入参数的类型是泛型，另一个是返回值前的泛型类型*/


    private  <E> void method(E []e) {
        for (E a:e){
            System.out.print(a+"\t");
        }
        System.out.println();
    }
    /*T类型*/
    private  <T> void method1(T t) throws InstantiationException, IllegalAccessException {
        Class<?> aClass = t.getClass();
        Object o = aClass.newInstance();

        System.out.println(t);

    }

    /*格式 for(1 2:3)
    1.数组元素的类型 2.变量名字  3.数组名
    增强for循环 比普通方法效率更高
    * 效率更高
    * 坏处    没有办法按照下标操作，只能从头到尾依次遍历*/
    /*普通for循环好处是可以设置循环的步长 */
    private void print(Object o[]) {
        for (Object a:o){
            System.out.print(a+"\t");
        }
        System.out.println();
    }

}
